import Vue from 'vue'
import VueRouter from 'vue-router'
// 导入全部 导出是用按需导出的，要一次性全导出来,得到的是一个对象，进行别名
import * as hooks from './hooks'
// import store from '@/store'
// import permissionList from './permission'

// 解析vue-router中间版本，在守卫时跳转有警告问题，但是在低一些版本或高版本中就没有问题
const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push(location, onResolve, onReject) {
  if (onResolve || onReject) return originalPush.call(this, location, onResolve, onReject)
  return originalPush.call(this, location).catch(err => err)
}

Vue.use(VueRouter)

// 参数1：你需要检索的目录  相对路径
// 参数2：检索的目录是否需要递归检索 true/false
// 参数3：指定检查返回的文件类型 正则
const moduleFn = require.context('./routes', false, /\.js$/i)
const routes = moduleFn.keys().reduce((prev, curr) => {
  let route = moduleFn(curr).default
  if (Array.isArray(route)) {
    prev.push(...route)
  } else {
    prev.push(route)
  }
  return prev
}, [])

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes
})

/* let roleRoute = {
  path: 'role',
  component: () => import('@/views/role'),
  meta: {
    breadcrumb: ['权限管理', '角色列表']
  }
}
 */
// 如何来找到需要路由权限认证的父路由
// 都是通过path路由来区别
// let adminRoute = router.options.routes.find(({ path }) => '/admin' === path)
// // 只有能查询到的规则路由才动态添加对应的路由
// if (adminRoute) {
//   adminRoute.children.push(roleRoute)
//   // 路由中有一个动态添加路由的方法  vue-router3和vue-router4
//   // 3和4版本中都可用的  router.addRoute(对象)
//   // 3及以下版本都可用的 router.addRoutes([对象])  在4中不可用
//   router.addRoute(adminRoute)
// }

// 写在此处，它没有一个条件判断，这样就会导致在没有登录时，也会执行，而且也在此处，它也不会每次路由切换都执行
// let adminRoute = router.options.routes.find(({ path }) => '/admin' === path)
// // 当前登录的用户拥有的权限列表
// let authList = JSON.parse(sessionStorage.getItem('user')).nodes
// // 让所有的子路由都添加一个路由前缀
// permissionList = permissionList.map(item => ({ ...item, path: '/admin/' + item.path }))
// // 比对当前用户的权限
// let showRouteList = permissionList.filter(({ path }) => authList.some(({ route }) => route === path))
// adminRoute.children.push(...showRouteList)
// router.addRoute(adminRoute)

// 导航守卫
Object.keys(hooks).forEach(key => router.beforeEach(hooks[key](router)))

export default router
